home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / elk-2_0.lha / elk-2.0 / src / stab.hp9k800.c < prev    next >
C/C++ Source or Header  |  1992-11-02  |  2KB  |  56 lines

  1. #include <a.out.h>
  2. #include <sys/types.h>
  3.  
  4. SYMTAB *Snarf_Symbols (f, hp) FILE *f; struct header *hp; {
  5.     SYMTAB *tab;
  6.     register SYM *sp, **nextp;
  7.     register n;
  8.     struct symbol_dictionary_record r;
  9.  
  10.     tab = (SYMTAB *)Safe_Malloc (sizeof (SYMTAB));
  11.     tab->first = 0;
  12.     nextp = &tab->first;
  13.     tab->strings = Safe_Malloc (hp->symbol_strings_size);
  14.     (void)fseek (f, (long)hp->symbol_strings_location, SEEK_SET);
  15.     if (fread (tab->strings, hp->symbol_strings_size, 1, f) != 1) {
  16.     (void)fclose (f);
  17.     Free_Symbols (tab);
  18.     Primitive_Error ("corrupt string table in object file");
  19.     }
  20.     (void)fseek (f, (long)hp->symbol_location, SEEK_SET);
  21.     for (n = hp->symbol_total; n > 0; n--) {
  22.     if (fread ((char *)&r, sizeof r, 1, f) != 1) {
  23.         (void)fclose (f);
  24.         Free_Symbols (tab);
  25.         Primitive_Error ("corrupt symbol table in object file");
  26.     }
  27.     if (r.symbol_type != ST_CODE)
  28.         continue;
  29.     if (r.symbol_scope != SS_UNIVERSAL)
  30.         continue;
  31.     sp = (SYM *)Safe_Malloc (sizeof (SYM));
  32.     sp->name = tab->strings + r.name.n_strx;
  33.     sp->value = r.symbol_value & ~3;  /* mask out privilege level */
  34.     *nextp = sp;
  35.     nextp = &sp->next;
  36.     *nextp = 0;
  37.     }
  38.     return tab;
  39. }
  40.  
  41. SYMTAB *Open_File_And_Snarf_Symbols (name) char *name; {
  42.     struct header hdr;
  43.     FILE *f;
  44.     SYMTAB *tab;
  45.  
  46.     if ((f = fopen (name, "r")) == NULL)
  47.     Primitive_Error ("can't open a.out file");
  48.     if (fread ((char *)&hdr, sizeof hdr, 1, f) != 1) {
  49.     (void)fclose (f);
  50.     Primitive_Error ("can't read a.out header");
  51.     }
  52.     tab = Snarf_Symbols (f, &hdr);
  53.     (void)fclose (f);
  54.     return tab;
  55. }
  56.